package letcode.oneQuestionPerDay._202004._14;

import letcode.util.ListNode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Description: 两数相加Ⅱ
 * @Date: 2020/4/14
 * @Author: 许群星
 */
public class TwoNumberTotalⅡ {
    public static void main(String[] args) {
        ListNode l1=new ListNode(7);
        l1.next=new ListNode(2);
        l1.next.next=new ListNode(4);
        l1.next.next.next=new ListNode(3);

        ListNode l2=new ListNode(5);
        l2.next=new ListNode(6);
        l2.next.next=new ListNode(4);

        ListNode res=addTwoNumbers(l1,l2);

        System.out.println(res.val);
        System.out.println(res.next.val);
        System.out.println(res.next.next.val);
        System.out.println(res.next.next.next.val);

    }
    //提供方法    未通过  list太麻烦  倒序使用栈
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //得到数量
        int a=0,b=0;
        List<Integer> listA=new ArrayList<>();
        List<Integer> listB=new ArrayList<>();

        while (l1!=null){
            listA.add(l1.val);
            l1=l1.next;
            a++;
        }
//        System.out.println(listA);
//        System.out.println(a);

        while (l2!=null){
            listB.add(l2.val);
            l2=l2.next;
            b++;
        }
//        System.out.println(listB);
//        System.out.println(b);
        List<Integer> total=new ArrayList<>();
        if (a>=b){
            int cur=0;
            for (int i = b-1; i >=0 ; i--) {
                int temp=listA.get(a-1)+listB.get(i)+cur;
                if (temp>9){
                    temp=temp%10;
                    cur++;
                }else {
                    cur=0;
                }
                total.add(temp);
                a--;
            }
            if (cur>0){
                for (int i = a; i >=0 ; i--) {
                    int temp=listA.get(i)+cur;
                    if (temp>9){
                        temp=temp%10;
                        cur++;
                    }else {
                        cur=0;
                    }
                    total.add(temp);
                    a--;
                }
                if (cur>0)
                    total.add(1);
            }else {
                for (int i = a-1; i >=0 ; i--) {
                    total.add(listA.get(i));
                }
            }

        }else {
            int cur=0;
            for (int i = a-1; i >=0 ; i--) {
                int temp=listA.get(i)+listB.get(b-1)+cur;
                if (temp>9){
                    temp=temp%10;
                    cur++;
                }else {
                    cur=0;
                }
                total.add(temp);
                a--;
            }
            if (cur>0){
                for (int i = b; i >=0 ; i--) {
                    int temp=listB.get(i)+cur;
                    if (temp>9){
                        temp=temp%10;
                        cur++;
                    }else {
                        cur=0;
                    }
                    total.add(temp);
                    b--;
                }
                if (cur>0)
                    total.add(1);
            }else {
                for (int i = b-1; i >=0 ; i--) {
                    total.add(listB.get(i));
                }
            }

        }
//        System.out.println(total);
        //放值问题   从后往前放
        int n=total.size();
        ListNode ans=null;
        for (int i = 0; i < n; i++) {
            ListNode node=new ListNode(total.get(i));
            node.next=ans;
            ans=node;
        }
        return ans;

    }

}
/*
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外，这两个数字都不会以零开头。
进阶：
如果输入链表不能修改该如何处理？换句话说，你不能对列表中的节点进行翻转。
示例：
输入：(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出：7 -> 8 -> 0 -> 7

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */